Skip to content

feat(cli): add app server to cli - #2034

Open
zvzuola wants to merge 1 commit into
GCWing:mainfrom
zvzuola:refactor-cli
Open

feat(cli): add app server to cli#2034
zvzuola wants to merge 1 commit into
GCWing:mainfrom
zvzuola:refactor-cli

Conversation

@zvzuola

@zvzuola zvzuola commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #

Type and Areas

Type:

Areas:

Motivation / Impact

Verification

Reviewer Notes

Checklist

  • This PR is focused and does not include secrets, temporary prompts, generated scratch files, or unrelated artifacts.
  • Relevant verification is recorded above, or skipped checks are explained.
  • User-facing strings, docs, and locales are updated where applicable.

@limityan limityan left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

总体判断

同意引入 TuiBackend,用统一端口解除 TUI 对 Core/Runtime 具体实现的直接依赖;但不建议把“Embedded 与 Shared 都必须经过 App Server”作为目标架构。当前 PR 实际上只有 Embedded 运行 BitfunAppServer,Shared 仍通过 agent-runtime-ipc v17SharedTuiBackend 只是兼容翻译层。因此本次变更主要获得了源码边界统一,并没有获得新的共享后端能力。

建议调整为以下方向后再合并:

TUI -> TuiBackend
  Embedded -> 进程内强类型 Runtime port
  Shared   -> 现有 Runtime IPC
  Web/外部 Rich Client -> App Server

这里统一的是 TUI 可依赖的行为契约,不要求所有部署模式使用同一 wire protocol。行为一致性应由 adapter contract tests 保证。

主要风险

  1. Shared 功能回退

    当前 Shared IPC 已负责实例发现和 token 校验、session controller lease、single-active-turn、断连取消、outcome_unknown、帧限制及空闲退出。App Server 当前没有这些进程和会话控制语义。Phase 5 如果仅把 Pipe/UDS wire 替换为 App Server,会造成并发控制、异常恢复和生命周期回退;在这些能力有明确 owner、协议和等价测试前,不应替换现有 Shared IPC。

  2. 默认 Embedded 路径增加了缺乏收益证明的复杂度

    Embedded 原本可以通过强类型 port 直接调用同进程 Runtime;当前实现增加专用线程、独立 Tokio runtime、request/response 分派以及 client/server 生命周期,却没有新增跨进程或共享能力,也没有启动时间、延迟或资源开销数据。这同时与 product-architecture.mdagent-runtime-deployment-design.md 中 Embedded 直连、默认 CLI 不承担 App Server 成本的现行约束冲突。

  3. capability 与 transport limits 不是 Host 的真实能力

    App Server/Shared adapter 宣称约 16 MiB,但 Shared IPC 实际为 128 KiB 请求、8 MiB 响应,WebSocket Host 实际约 256 KiB;Server Host 未注入 context_reload 时仍会宣称相关方法可用。客户端会据此作出错误决策。capability、限制及 unsupported reason 应由具体 Host/transport 构造,不能由通用协议层写死。

  4. WebSocket 能力面被隐式扩大

    通用 BitfunAppServer 注册 TUI handlers 后,Web Host 也可能暴露 shell、diff、context reload 等本地控制能力。现有 WebSocket 主要依赖 loopback/origin allowlist,缺少完整的连接身份、workspace/user/execution binding。应按 Host 显式注册允许的 handler,并在扩大能力前完成相应威胁模型和认证边界。

  5. 迁移计划不应放在架构文档目录

    docs/architecture/tui-app-server-decoupling-refactor-plan.md 记录的是阶段性计划、未完成 Phase 和迁移差距,不是当前稳定架构。放在 docs/architecture 会与权威现状文档并列,并且当前内容已经与部署设计产生冲突。请移到现有的 docs/plans/tui-app-server-decoupling-refactor-plan.md;如果方案仍待决策,也可以先保留在 Issue/PR 描述中。稳定决策和已交付运行链路再同步到权威架构文档。

建议修改

  • 保留 TuiBackend,新增/恢复直接调用 Runtime port 的 Embedded adapter;不要让 TUI 绕过该抽象。
  • Shared 继续使用现有 IPC adapter;不要在本 PR 中承诺迁移到 App Server wire。
  • AppServerTuiBackend 只用于已有明确需求的 Web/外部 Rich Client;后续有真实消费者时再扩展协议。
  • 为 Embedded、Shared、App Server adapters 建立同一组核心 session/turn 行为契约测试,而不是通过强制同一 transport 获得一致性。
  • 将 capability、限制、handler 注册和安全策略下放给 Host,并补齐 Shared 语义后再单独评审物理协议迁移。
  • 移动 plan 文档,并同步修正与现行架构文档冲突的目标描述。
  • 修复当前 Frontend Build 的 ConfigUpdate 生成类型失败,并在 PR 描述中补充架构影响、验证结果和迁移边界。

这个方向仍能保留本 PR 最有价值的 TUI 解耦,同时避免默认 CLI 的额外协议成本、双协议长期并存,以及未来 Shared 能力回退。

@limityan

limityan commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

补充:基于最新 head e6705251 的长期演进建议(供决策)

先确认本次更新:ConfigUpdate 的 TS 生成问题已补充修复,迁移 plan 也已从 docs/architecture 移到 docs/plans。以下只讨论长期路线,不替作者/维护者作最终决策,也不要求在本 PR 一次完成所有阶段。

1. 当前真正需要解决的问题

最新版的实际运行链路仍是:

flowchart LR
  TUI --> TB["TuiBackend<br/>当前直接使用 App Server DTO"]
  TB -->|Embedded| EA["AppServerTuiBackend"] --> IM["in-memory App Server"] --> ER["Embedded Runtime"]
  TB -->|Shared| SA["SharedTuiBackend<br/>协议翻译"] --> IPC["Runtime IPC v17<br/>Pipe / UDS"] --> SR["Shared Runtime"]
Loading

因此当前统一的是 TUI 源码侧接口和 DTO,尚未统一 Shared 的鉴权、controller/lease、事件恢复、断连取消和进程生命周期。SharedTuiBackend 仍需合成 App Server 的 initialize、capabilities 和 limits,也说明客户端内部端口与外部 wire contract 发生了耦合。

长期设计应把三个问题分开:

  1. 客户端行为契约:TUI/GUI 需要哪些稳定用例、错误和事件。
  2. 业务实现与 owner:Session、Turn、Permission、Workspace 等仍由既有 Runtime owner/ports 负责。
  3. 部署与连接治理:Embedded、Shared、Web/Remote 各自需要不同的 transport、认证、controller 和生命周期。

统一第 1、2 层,不等于现在就必须统一第 3 层的 wire。

2. 几种长期方向对比

方向 主要收益 主要代价与风险 判断
A. 所有 Rich Client 统一经过 App Server client/schema/wire 客户端模型一致,生成 SDK 和跨进程接入直接 默认 Embedded 增加协议线程与生命周期;必须重做 Shared 已成熟的连接治理;过早冻结协议会扩大变更半径 可以作为成熟后的目标候选,不建议现在写成不可变前提
B. Embedded、Shared、App Server 三套 adapter 完全独立 当前改动最小,Shared 风险最低 DTO、错误、事件和用例实现容易长期漂移,测试矩阵不断扩大 适合短期过渡,不适合作为完整长期方案
C. 共享 Runtime 用例/owner ports,保留部署专用 adapter 与 wire 行为实现统一,同时保留 Embedded 低成本路径和 Shared 现有可靠性;未来仍可收敛 wire 会有一段双协议、映射和合同测试成本,需要明确退役门槛 推荐,属于前述第二种方向的增强版

3. 推荐目标结构

flowchart TB
  TUI --> TB["TuiBackend<br/>TUI 内部稳定契约"]
  TB --> EA["Embedded adapter"]
  TB --> SA["Shared v17 adapter"]

  EA --> UC["窄的 Runtime use cases / owner ports"]
  SA --> V17["Private Pipe / UDS IPC"] --> HA["Shared Host authority<br/>identity · controller · event arbitration"]

  RC["Web / Desktop / external Rich Client"] --> ASC["App Server client / transport"] --> AR["App Server router"]
  AR --> HA
  HA --> UC
Loading

图中的 Runtime use cases 表示同一套实现与合同,不表示全局单例。建议优先复用现有 Runtime API、runtime-ports 和 owner handler,只抽取已经重复的复合用例,不新增大而全的第二个 Runtime service。剪贴板、外部编辑器、终端 raw mode 等 controller-local effect 继续留在 Client/Host。

TuiBackend 这个边界值得保留,但长期不应直接以 bitfun_app_server_protocol DTO、initialize/healthAppServerEvent 塑形;应改为 TUI-local 或稳定 domain DTO,由 Embedded、Shared v17、App Server adapter 分别映射。

4. 粗粒度分阶段建议

  1. 阶段 0:先稳定边界

    • 保留 TuiBackend 概念,逐步解除它与 App Server wire DTO 的直接绑定。
    • Embedded 默认走同进程强类型 adapter;Shared 继续使用现有 v17 IPC。
    • 架构文档区分 Current、Proposed 和有证据门控的最终决策,不先承诺删除 v17。
  2. 阶段 1:统一业务行为

    • 让 Embedded adapter、Shared handler 和 App Server router 复用同一组窄 Runtime use cases/owner ports。
    • 为 Session/Turn/Permission/取消/未知结果建立跨 adapter 行为合同测试,避免三套业务实现。
  3. 阶段 2:让 App Server 在真实 Rich Client 中成熟

    • 以实际 Web/Desktop/外部 Client 的垂直切片推进,而不是先扩大全量 method。
    • 补齐版本与 capability、方向性 limits、身份与作用域、背压、事件 lag/resync、断连恢复、配置/环境来源和性能基准。
  4. 阶段 3:Shared 双栈验证

    • 可在现有 Shared Host 中增加默认关闭的 App Server transport,保留 v17 作为可回滚路径。
    • 开放第二 transport 前,两条 transport 必须共享 Host-scoped connection authority、controller registry、Session 事件过滤、operation identity/deadline/cancel 和未知结果登记;否则可能出现双 controller 或策略绕过。
    • 先迁移一个第一方 Client 灰度验证,并覆盖跨 transport 竞争、断连、迟到结果和 Host 崩溃。
  5. 阶段 4:按证据决定是否收敛 wire

    • 只有在鉴权、instance identity、controller/lease、事件恢复、背压、outcome_unknown、Windows Job/Named Pipe、Unix 清理以及启动/延迟/内存达到等价后,才决定是否让 Shared TUI 改走 App Server 并删除 v17。
    • 如果没有足够的多 Rich Client 收益,保留私有 Shared IPC 也是合理终态;业务实现仍然可以保持统一。

5. 是否值得以及主要代价

值得长期投入的是:稳定的客户端端口、共享的 Runtime 用例实现,以及面向真实 Rich Client 的 App Server 边界。当前不值得预先承诺的是:为了形式上的单一 wire,让默认 Embedded 和已成熟 Shared 同时承担协议迁移风险

推荐方案的主要代价是阶段性维护 v17 与 App Server 两套协议、映射和故障测试;但这部分成本是有边界、可回滚的,换来的是不牺牲当前 Shared 的 controller、安全与恢复语义。是否最终删除 v17,应由真实消费方数量、维护成本和等价验证结果决定。

6. 同类产品的启示

  • Codex TUI 已支持 Embedded、Local Daemon 和 Remote App Server target,说明 AppServer-first 在协议、Client 生命周期和恢复语义成熟后是可行路线,但不能证明 BitFun 可以跳过现有 Shared 语义的等价迁移。
  • OpenCode TUI 采用 server/client 合同,但默认本地路径通过 Worker 和 in-process app.fetch 调用,只有显式网络参数才走网络。这说明“统一客户端语义”不必等同于“所有部署立即统一物理 wire”。

这些实现更能证明 App Server 路线的长期可行性,而不是证明当前阶段必须替换 BitFun 的 v17 Shared IPC。

7. 对最新版架构文档的建议

docs/plans 的目录调整已经符合预期。对于新增 app-server-architecture.md 中“Embedded Rich Client 必须经过 App Server”以及“Shared 最终删除旧 wire”的绝对表述,建议暂时改为 Proposed target + 明确决策门槛。如果作者最终仍选择方向 A,也建议把额外启动/资源成本、Shared 治理迁移范围和回滚条件作为显式取舍记录下来;最终方向由作者和维护者基于上述证据决定。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants